﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanLyHocPhi.BLL;
using QuanLyHocPhi.Model;
using System.IO;
using QuanLyHocPhi.GUI.DuLieu;

namespace QuanLyHocPhi.GUI.TacNghiep
{
    public partial class FormThuHocPhiSinhVien : FormBase
    {
        #region Private properties
        const string DANOP = "Đã nộp";
        const string CHUANOP = "Chưa nộp";
        //int minWidthForm = 463, maxWidthForm = 914;
        static string MaSV = "";
        //string fileName = "";
        public string MaLopHocPhan { get; set; }
        LoaiSinhVien loaiSinhVien;
        SinhVien sinhVien;
        PhieuThu phieuThu;
        private bool chuyenPT = false;
        #endregion

        public FormThuHocPhiSinhVien(string masv)
        {
            InitializeComponent();
            if (!string.IsNullOrEmpty(masv))
            {
                txtMaSV.Text = masv;
                panelNhapMa.Enabled = false;
                txtMaSV_KeyPress(this, new KeyPressEventArgs((char)13));
            }
        }
        public FormThuHocPhiSinhVien(string masv, bool chuyen)
        {
            InitializeComponent();
            if (!string.IsNullOrEmpty(masv))
            {
                txtMaSV.Text = masv;
                panelNhapMa.Enabled = false;
                chuyenPT = true;
                txtMaSV_KeyPress(this, new KeyPressEventArgs((char)13));
            }
        }

        void ClearData()
        {
            lbChuyenNganh.Text = "";
            lbGioiTinh.Text = "";
            lbHoten.Text = "";
            lbNgaysinh.Text = "";
            lbNoiSinh.Text = "";
            lbSoDienThoai.Text = "";
            MaSV = "";
            sinhVien = null;
            phieuThu = null;
            MaLopHocPhan = "";
        }

        private void txtMaSV_KeyPress(object sender, KeyPressEventArgs e)
        {
            thongBaoLoi.Clear();
            if (e.KeyChar == 13)
            {
                e.Handled = true;

                #region Tiền xử lý
                bdsLop.DataSource = null;
                var maSV = txtMaSV.Text.Trim();
                if (maSV.Length == 0)
                {
                    thongBaoLoi.SetError(txtMaSV, "Bạn chưa nhập mã sinh viên");
                    ClearData();
                    return;
                }
                //Lấy về thực thể sinh viên tương ứng với mấ sinh viên
                sinhVien = BizSinhVien.GetSinhVienByMaSinhVien(maSV);
                if (sinhVien == null)
                {
                    thongBaoLoi.SetError(txtMaSV, "Sinh viên này không tồn tại. Vui lòng kiểm tra lại danh sách sinh viên");
                    ClearData();
                    return;
                }
                #endregion

                #region Điền thông tin sinh viên lên form
                lbHoten.Text = sinhVien.HoDem.Trim() + " " + sinhVien.Ten.Trim();
                lbNgaysinh.Text = sinhVien.NgaySinh;
                lbNoiSinh.Text = sinhVien.NoiSinh;
                lbSoDienThoai.Text = sinhVien.SoDienThoai;
                lbGioiTinh.Text = sinhVien.GioiTinh.HasValue ? (sinhVien.GioiTinh.Value ? "Nam" : "Nữ") : "Không biết";
                var lop = BizLopGoc.GetLopByMaLop(sinhVien.KC_MaLop);
                if (lop != null)
                {
                    var truong = BizTruong.GetTruongByMaTruong(lop.MaTruong);
                    lbLop.Text = lop.TenLop + "-" + lop.NamTuyenSinh.ToString();
                    if (truong != null)
                        lbTruong.Text = truong.TenTruong;
                }


                #endregion

                MaSV = sinhVien.MaSinhVien;
                //Xác định loại sinh viên để lấy lớp tương ứng
                loaiSinhVien = (LoaiSinhVien)sinhVien.MaLoai;
                DataTable dt = new DataTable();
                #region Tạo cột cho bảng
                dt.Columns.Add("TenLopHocPhan", type: typeof(string));
                dt.Columns.Add("HocPhi", type: typeof(string));
                dt.Columns.Add("TrangThai", type: typeof(string));
                dt.Columns.Add("MaLop", type: typeof(string));
                dt.Columns.Add("ThaoTac", type: typeof(string));
                dt.Columns.Add("GhiChu", type: typeof(string));
                dt.Columns.Add("MaPhieuThu", type: typeof(string));
                #endregion

                //Lấy về danh sách mà sinh viên đã nộp tiền hoặc chưa nộp tiền trong danh sách lớp
                if (true)//loaiSinhVien == LoaiSinhVien.SinhVienKhongChuyen)
                {
                    //Xử lý cho trường hợp sinh viên không chuyên đến nộp tiền
                    #region Đỗ dữ liệu vào cho bảng
                    colTenLop.HeaderText = "Tên lớp";
                    lbChuyenNganh.Visible = false;
                    lbTextCN.Visible = false;
                    var listLopHocPhan_SinhVien = BizSinhVien.GetLopHocPhan_SinhVien(maSinhVien: maSV);
                    for (int i = 0; i < listLopHocPhan_SinhVien.Count; i++)
                    {
                        var lopHocPhan = BizLopHocPhan.GetLopHocPhanByMaLHP(maLopHP: listLopHocPhan_SinhVien[i].MaLopHocPhan);
                        var row = dt.NewRow();
                        row["TenLopHocPhan"] = lopHocPhan.TenLopHocPhan + " " + lopHocPhan.HocKy.SoHieuHocKy.ToString() + "/" + lopHocPhan.HocKy.NamHoc.ToString();
                        //Nếu đã nộp học phí thì tiền học phí được lấy bên phiếu thu
                        var maPhieuThu = listLopHocPhan_SinhVien[i].MaPhieuThu;
                        if (!string.IsNullOrEmpty(maPhieuThu))
                        {
                            if (chuyenPT)
                                continue;
                            //Đã nộp học phí
                            row["TrangThai"] = DANOP;
                            //Lấy về phiếu thu tương ứng
                            var phieuThu = BizPhieuThu.GetPhieuThu(maPhieuThu);
                            if (phieuThu == null)
                            {
                                //MessageBox.Show("Phiếu thu: " + maPhieuThu + "này không tồn tại", "Lỗi đồng bộ dữ liệu");

                                BizPhieuThu.Update_LopHocPhan_SinhVienKhongChuyen(listLopHocPhan_SinhVien[i]);
                                // MessageBox.Show("Lỗi dữ liệu", "Lỗi đồng bộ dữ liệu");
                                row["GhiChu"] = listLopHocPhan_SinhVien[i].GhiChu;
                                var hocPhi = lopHocPhan.HocPhi;
                                hocPhi += lopHocPhan.PhuThu;
                                decimal mienGiam = (decimal)(listLopHocPhan_SinhVien[i].HeSoMienGiam);
                                if (mienGiam == 1)
                                {
                                    row["TrangThai"] = "Miễn";
                                }
                                else
                                {
                                    hocPhi -= hocPhi * mienGiam;
                                    hocPhi = Math.Round(hocPhi, 0);
                                    row["HocPhi"] = hocPhi.ToString().FormatCurrency();
                                    row["TrangThai"] = CHUANOP;

                                }
                                row["ThaoTac"] = "Xóa";
                                //continue;
                            }
                            else
                            {
                                row["HocPhi"] = phieuThu.SoTien.ToString().FormatCurrency();
                                row["GhiChu"] = listLopHocPhan_SinhVien[i].GhiChu;
                                row["MaPhieuThu"] = phieuThu.MaPhieuThu;
                            }
                        }
                        else
                        {
                            //Chưa nộp học phí
                            row["GhiChu"] = listLopHocPhan_SinhVien[i].GhiChu;
                            var hocPhi = lopHocPhan.HocPhi;
                            hocPhi += lopHocPhan.PhuThu;
                            decimal mienGiam = (decimal)(listLopHocPhan_SinhVien[i].HeSoMienGiam);
                            if (mienGiam == 1)
                            {
                                row["TrangThai"] = "Miễn";
                            }
                            else
                            {
                                hocPhi -= hocPhi * mienGiam;
                                hocPhi = Math.Round(hocPhi, 0);
                                row["HocPhi"] = hocPhi.ToString().FormatCurrency();
                                row["TrangThai"] = CHUANOP;

                            }
                            row["ThaoTac"] = "Xóa";
                        }
                        row["MaLop"] = lopHocPhan.MaLopHocPhan;

                        dt.Rows.Add(row);
                    }
                    #endregion
                }
                else if (false)
                {
                    //Xử lý cho trường hợp sinh viên chuyên đến nộp tiền

                    #region Đỗ dữ liệu lên form
                    lbChuyenNganh.Visible = true;
                    lbTextCN.Visible = true;
                    if (!string.IsNullOrEmpty(sinhVien.C_MaLopChuyenNganh))
                    {
                        var lopCN = BizLopChuyenNganh.GetLopChuyenNganhByMaLCN(sinhVien.C_MaLopChuyenNganh);
                        if (lopCN != null)
                        {
                            var nganh = BizChuyenNganh.GetNganhByMaNganh(lopCN.MaChuyenNganh);
                            if (nganh != null)
                                lbChuyenNganh.Text = nganh.TenNganh;
                        }
                    }
                    #endregion

                    #region Đỗ dữ liệu vào cho bảng
                    var listLopChuyenNganh_SinhVien = BizLopHocPhanChuyenNganh_SinhVien.GetListLopHocPhanChuyenNganh(maSV);
                    //colTenLop.HeaderText = "Học kỳ";
                    for (int i = 0; i < listLopChuyenNganh_SinhVien.Count; i++)
                    {
                        //var lopChuyenNganh = BizLopChuyenNganh.GetLopChuyenNganhByMaLCN(maLopCN: listLopChuyenNganh_SinhVien[i].MaLopChuyenNganh);
                        //var hocKy = BizHocKy.GetHocKyByMaHK(lopChuyenNganh.MaHocKy);
                        var row = dt.NewRow();
                        row["TenLopHocPhan"] = listLopChuyenNganh_SinhVien[i].LopHocPhanChuyenNganh.TenLopHocPhanChuyenNganh;
                        //Nếu đã nộp học phí thì tiền học phí được lấy bên phiếu thu
                        var maPhieuThu = listLopChuyenNganh_SinhVien[i].MaPhieuThu;
                        if (!string.IsNullOrEmpty(maPhieuThu))
                        {
                            //Đã nộp học phí
                            row["TrangThai"] = DANOP;
                            //Lấy về phiếu thu tương ứng
                            var phieuThu = BizPhieuThu.GetPhieuThu(maPhieuThu);
                            row["HocPhi"] = phieuThu.SoTien.ToString().FormatCurrency();
                            row["ThaoTac"] = "Xóa";
                        }
                        else
                        {
                            //Chưa nộp học phí
                            row["TrangThai"] = CHUANOP;
                            var hocPhi = listLopChuyenNganh_SinhVien[i].LopHocPhanChuyenNganh.HocPhi;
                            hocPhi += listLopChuyenNganh_SinhVien[i].LopHocPhanChuyenNganh.PhuThu;
                            decimal mienGiam = (decimal)listLopChuyenNganh_SinhVien[i].HeSoMienGiam;
                            hocPhi -= hocPhi * mienGiam / 100;
                            hocPhi = Math.Round(hocPhi, 0);
                            row["HocPhi"] = hocPhi.ToString().FormatCurrency();
                        }
                        row["MaLop"] = listLopChuyenNganh_SinhVien[i].MaLopHocPhanChuyenNganh;
                        dt.Rows.Add(row);
                    }
                    #endregion
                }

                bdsLop.DataSource = dt;
                #region Nạp dữ liệu vào grid
                gridQuaTrinhNopHocPhi.AutoGenerateColumns = false;
                gridQuaTrinhNopHocPhi.AllowUserToAddRows = false;
                gridQuaTrinhNopHocPhi.AllowUserToDeleteRows = false;
                //gridQuaTrinhNopHocPhi.ReadOnly = true;
                colTenLop.DataPropertyName = "TenLopHocPhan";
                colHocPhi.DataPropertyName = "HocPhi";
                colTrangThai.DataPropertyName = "TrangThai";
                colMaLop.DataPropertyName = "MaLop";
                colThaoTac.DataPropertyName = "ThaoTac";
                colGhiChu.DataPropertyName = "GhiChu";
                colMaPhieuThu.DataPropertyName = "MaPhieuThu";
                gridQuaTrinhNopHocPhi.DataSource = bdsLop;
                #endregion
            }
        }

        private void gridQuaTrinhNopHocPhi_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //throw new Exception("Cài đặt lại hàm gridQuaTrinhNopHocPhi_CellContentClick! :D");
            if (e.RowIndex == -1)
                return;

            MaLopHocPhan = gridQuaTrinhNopHocPhi.Rows[e.RowIndex].Cells[3].Value.ToString();

            var value = gridQuaTrinhNopHocPhi.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
            if (value.Equals(CHUANOP))
            {
                if (chuyenPT)
                {
                    this.Close();
                }
                else
                {
                    ChiTietPhieuThu frmCT = new ChiTietPhieuThu(sinhVien, MaLopHocPhan);
                    frmCT.ShowDialog();
                }
            }
            else if (value.Equals("Miễn"))
            {
                ChiTietPhieuThu frmCT = new ChiTietPhieuThu(sinhVien, MaLopHocPhan);
                frmCT.ShowDialog();
            }
            else if (value.Equals(DANOP))
            {
                if (true)//sinhVien.MaLoai == (int)LoaiSinhVien.SinhVienKhongChuyen)
                {
                    //Dựa vào mã sinh viên và mã lớp học phần ta lấy được mã phiếu thu
                    var lopHPSV = BizSinhVien.GetLopHocPhan_SinhVien(sinhVien.MaSinhVien, MaLopHocPhan);
                    phieuThu = BizPhieuThu.GetPhieuThu(lopHPSV.MaPhieuThu);
                }
                //else
                //{
                //    var lopCNSV = BizLopHocPhanChuyenNganh_SinhVien.GetLopHPCN_SinhVien(sinhVien.MaSinhVien,
                //                                                                        MaLopHocPhan);
                //    phieuThu = BizPhieuThu.GetPhieuThu(lopCNSV.MaPhieuThu);
                //}
                ChiTietPhieuThu frmCT = new ChiTietPhieuThu(phieuThu);
                frmCT.ShowDialog();
            }
            else if (value.Equals("Xóa"))
            {
                if (MessageBox.Show("Bạn có chắc muốn xóa không?", "Chú ý", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.OK)
                {
                    var lopHPSV = BizSinhVien.GetLopHocPhan_SinhVien(sinhVien.MaSinhVien, MaLopHocPhan);
                    BizLopHocPhan.Delete_ThongTinDangKyLopHocPhan(MaLopHocPhan, sinhVien.MaSinhVien);
                    gridQuaTrinhNopHocPhi.Rows.RemoveAt(e.RowIndex);
                }
            }
            if (e.ColumnIndex == 2)
            {
                txtMaSV_KeyPress(sender, new KeyPressEventArgs((char)13));
            }
        }

        private void bntOK_Click(object sender, EventArgs e)
        {
            txtMaSV_KeyPress(sender, e: new KeyPressEventArgs((char)13));
        }

        private void FormThuHocPhiSinhVien_Load(object sender, EventArgs e)
        {
        }



        private void gridQuaTrinhNopHocPhi_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 5)
            {
                string ghiChu = gridQuaTrinhNopHocPhi.Rows[e.RowIndex].Cells[5].Value.ToString();
                if (string.IsNullOrEmpty(ghiChu))
                    ghiChu = "";
                else
                    ghiChu = ghiChu.Length >= 250 ? ghiChu.Substring(0, 249) : ghiChu;
                //string maPhieuThu = gridQuaTrinhNopHocPhi.Rows[e.RowIndex].Cells[6].Value.ToString();
                string maSinhVien = sinhVien.MaSinhVien;
                string maLopHocPhan = gridQuaTrinhNopHocPhi.Rows[e.RowIndex].Cells[3].Value.ToString();
                BizLopHocPhan.UpdateLHP_SV(maSinhVien, maLopHocPhan, ghiChu);

                //BizPhieuThu.UpdatePhieuThu(maPhieuThu, ghiChu);
            }
        }

        private void gridQuaTrinhNopHocPhi_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 5 && e.RowIndex != -1)
            {
                string maLopHocPhan = gridQuaTrinhNopHocPhi.Rows[e.RowIndex].Cells[3].Value.ToString();
                LopHocPhan_SinhVien lopHP_SV = BizSinhVien.GetLopHocPhan_SinhVien(sinhVien.MaSinhVien, maLopHocPhan);
                if (lopHP_SV != null)
                {
                    gridQuaTrinhNopHocPhi.Rows[e.RowIndex].Cells[5].ToolTipText = lopHP_SV.GhiChu;
                }
            }
        }
    }
}
